import Vue from 'vue';
import Vuex from 'vuex';
import {getCookieValue,getCookieValue2} from '~/util/index.js';
Vue.use(Vuex);
/**
 * 本来想像spa页面那样写》》
 * vuex在服务器端的预渲染中也会初始化。
 * 在服务器端是没有window对象的，浏览器才有。
 * 但是服务器端和浏览器端都有全局对象global。
 * 浏览器端的global指向window对象。
 * 我通过判断有没有global.document（如果是浏览器端就会有（即等同window.document），服务器端就没有），
 * 就知道是否是浏览器端。
 * //let lsUser = global.document ? localStorage.getItem('user') : '{}';
 * 
 * 但是！！！！》》
 * 在服务器端渲染中：用户在浏览器直接输入地址访问路由时，是不会加载任何js的（包括我从localStorage里面拿token并设置到vuex里，然后vuex的token设置到axios请求头的逻辑），
 * 我要想得到用户登录的token，只有请求头的cookie是自动携带的，所以token只能存在cookie里面，而不能存在Storage里面！
 * 
 * 现在登录流程是登录后token存在cookie里（然后同时把token设置在vuex中和axios的请求头中）。服务器端在req.header.cookie去取（浏览器请求后台路由时，请求头中会自动携带cookie）
 * （一般在vuex里获取并设置到vuex）。
 * （注意：好些地方可以调用req对象，比如asyncData的参数context.req）
 * 退出登录就清除cookie中的token以及清除vuex中的token
 */
import aes from '~/util/aes.js'

const store = function() {
	return new Vuex.Store({
		/**
		 * 默认值给对象，调用不存在的属性不会报错。默认值给null，调用不存在的属性则会报错。
		 */
		state: {
			token: '',
			user:{},
			agent:{},//预注册的代理人登录后返回的信息
			isUpdateTel: false, //手机号码更换必须先经过验证
			orderDetailList: [],
			role_id: 0,
			totalObj: {},
		},
		mutations: {
			setToken(state, token) {
				state.token = token
			},
			delToken(state, token) {
				state.token = ''
			},
			setUser(state, user) {
				state.user = user
			},
			delUser(state, user) {
				state.user = {}
			},
			setAgent(state, agent) {
				state.agent = agent
			},
			getOrderDetailList(state, detailList) {
				state.orderDetailList = detailList
			},
			setRoleId(state, role_id) {
				state.role_id = role_id
			},
			setTotal(state, totalObj) {
				state.totalObj = totalObj
			}
		},
		actions: {
			//nuxt扩展的方法(在服务器端初始化时执行)
			nuxtServerInit({
				commit
			}, {
				req
			}) {
				let cookie = req.headers.cookie;
				let token = getCookieValue('token',cookie);
				commit('setToken', token);
				let user = getCookieValue('user',cookie);
				commit('setUser', user?JSON.parse(aes.Decrypt(user)):{});
				let agent = getCookieValue('agent',cookie);
				commit('setAgent', agent?JSON.parse(aes.Decrypt(agent)):{});
			}
		},
		getters: {
		}
	})
}
export default store;